﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TicketsPhone.Web.Models;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Domain.Access;
using TicketsPhone.Web.Utils;

namespace TicketsPhone.Web.Controllers
{
    public class SucursalesController : BaseController, IConsultasSeccion<SucursalFormModel>
    {

        public TipoModulo ModuloActual
        {
            get { return TipoModulo.Sucursales; }
        }

        SucursalRepositorio _sucursal = new SucursalRepositorio();
        EntidadRepositorio _entidad = new EntidadRepositorio();
        CiudadRepositorio _ciudad = new CiudadRepositorio();

        public ActionResult Listar()
        {
            SucursalFormModel model = new SucursalFormModel();
            List<Sucursal> lista = new List<Sucursal>();

            _sucursal.Objeto = new Sucursal();

            if (!string.IsNullOrEmpty(Request.QueryString["buscador"]))
            {
                _sucursal.Objeto.Nombre = Request.QueryString["buscador"];
            }

            model.CargarDatosPaginados(_sucursal.Filtrar());

            return View(model);
        }

        public ActionResult Editar(int id)
        {
            SucursalFormModel model = new SucursalFormModel();
            model.Objeto = _sucursal.Cargar(id);
            CargarDatos(model, id);

            if (model.Objeto.IdSucursal.HasValue)
            {
                return View(model);
            }
            else
            {
                return RedirectToAction("Listar");
            }
        }
        
        [HttpPost]
        public ActionResult Editar(SucursalFormModel model, int id)
        {
            if (ModelState.IsValid)
            {
                GuardarSucursal(model, id);
            }

            return View(model);
        }

        public ActionResult Crear()
        {
            SucursalFormModel model = new SucursalFormModel();
            model.Accion = TipoTransaccion.Crear;
            CargarDatos(model, 0);
            return View(model);
        }

        [HttpPost]
        public ActionResult Crear(SucursalFormModel model)
        {
            if (ModelState.IsValid)
            {
                GuardarSucursal(model, 0);
            }

            return View(model);
        }

        public ActionResult Eliminar(int id)
        {
            BaseModel model = new BaseModel();

            if (_sucursal.Eliminar(id))
                model.Javascript = Scripts.RedireccionConMensaje("/Sucursales/Listar", "Sucursal eliminado correctamente");
            else
            {
                string mensaje = "La sucursal no se pudo eliminar";

                if (_sucursal.TipoError == TipoErrorSql.ReferenceConstraint)
                {
                    //if (_sucursal.Error.IndexOf("FK_Entidad_Sucursal") > 0)
                    //{
                    //    mensaje = "ERROR: El perfil tiene permisos asociados.";
                    //}
                }

                model.Javascript = Scripts.RedireccionConMensaje("/Sucursales/Listar", mensaje);
            }

            return View(model);
        }


        public ActionResult GuardarHorario(int id)
        {
            Horario obj = new Horario();

            obj.IdHorario = Convert.ToInt32(Request.QueryString["IdHorario"]);
            obj.HoraFin =  new Domain.Utils.Hora(Request.QueryString["HoraFin"]);
            obj.HoraInicio = new Domain.Utils.Hora(Request.QueryString["HoraInicio"]);
            obj.Sucursal.IdSucursal = id;
            obj.Dia = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), Request.QueryString["Dia"], true);
            obj.CajerosActivos = Convert.ToInt32(Request.QueryString["Cajeros"]);
            try
            {
                if (obj.IdHorario > 0)
                {
                    _sucursal.EditarHorario(obj);
                }
                else
                {
                    obj.IdHorario = _sucursal.InsertarHorario(obj);
                }

                return new JsonResult() { Data = obj.IdHorario, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
            }
            catch (Exception e)
            {
                LogErroresRepositorio.GuardarLog(e);
                return new JsonResult() { Data = 0, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
            }
            
        }


        #region Metodos
        private void GuardarSucursal(SucursalFormModel model, int id)
        {
            _sucursal.Objeto = model.Objeto;
            _sucursal.Objeto.FechaModificacion = DateTime.Now;

            bool operacionExitosa = false;
            TipoTransaccion tipoTransaccion = TipoTransaccion.Editar;

            if (id == 0)
            {
                tipoTransaccion = TipoTransaccion.Crear;
                id = _sucursal.Crear();
                _sucursal.Objeto.IdSucursal = id;
                operacionExitosa = id > 0;
            }
            else
            {
                _sucursal.Objeto.IdSucursal = id;
                operacionExitosa = _sucursal.Editar();
            }

            if (operacionExitosa)
            {
                GuardarLogTransaccion(tipoTransaccion, model.Objeto);
                if (GuardarTramitesAsignados(model.Tramites, id))
                {
                    model.Javascript = Scripts.RedireccionConMensaje("/Sucursales/Listar", "Sucursal guardada correctamente");
                }
                else
                {
                    model.Javascript = Scripts.Alert("La sucursal no se pudo guardar. Error guardando los tramites");
                }

            }
            else
            {
                model.Javascript = Scripts.Alert("La sucursal no se pudo guardar");
            }
        }

        /// <summary>
        /// Asigna o borra la asignación de un tramite a una sucursal
        /// </summary>
        /// <param name="tramites">listado de tramites del modelo</param>
        /// <param name="idSucursal">id de la sucursal</param>
        private bool GuardarTramitesAsignados(List<TramitesSucursal> tramites, int idSucursal)
        {
            
            foreach (var tramite in tramites)
            {
                try
                {
                    if (tramite.Activo)
                    {
                        _sucursal.AsignarTramite(tramite.Tramite.IdTramite, idSucursal);
                    }
                    else
                    {
                        _sucursal.EliminarTramite(tramite.Tramite.IdTramite, idSucursal);
                    }
                }
                catch (Exception e)
                {
                    LogErroresRepositorio.GuardarLog(e);
                    return false;
                }
                
            }

            return true;
        }

        /// <summary>
        /// Carga los datos adicionales al modelo, como entidades, ciudades y tramites
        /// </summary>
        /// <param name="model"></param>
        /// <param name="id"></param>
        private void CargarDatos(SucursalFormModel model, int id)
        {
            model.Entidades = _entidad.ObtenerTodos();
            model.Ciudades = _ciudad.Filtrar(null);
            model.Tramites = _sucursal.ObtenerTramitesAsignados(id);
            model.Horarios = _sucursal.ObtenerHorario(id);
            model.ListaHoras = new List<string>();
            model.ListaMinutos = new List<string>();

            for (int hora = 0; hora < 24; hora++)
            {
                if (hora < 10)
                {
                    model.ListaHoras.Add("0" + hora.ToString());
                }
                else
                {
                    model.ListaHoras.Add(hora.ToString());
                }
            }

            for (int minuto = 0; minuto < 60; minuto++)
            {
                if (minuto < 10)
                {
                    model.ListaMinutos.Add("0" + minuto.ToString());
                }
                else
                {
                    model.ListaMinutos.Add(minuto.ToString());
                }
            }
        }
        #endregion
    }
}
